package com.woniuxy.realm;

import java.util.HashSet;
import java.util.Set;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

import com.woniuxy.entity.Perms;
import com.woniuxy.entity.Roles;
import com.woniuxy.entity.User;
import com.woniuxy.service.ProductService;
import com.woniuxy.service.UserService;

//进行认证和授权
public class MyRealm extends AuthorizingRealm {
	// 注入service
	@Autowired
	private UserService userService;

	// 从数据获取权限信息
	// 用来从数据库获得角色，权限信息

	
	@Autowired
	private ProductService goodsService;
	
    
	//从数据获取权限信息
	//用来从数据库获得角色，权限信息

	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// TODO Auto-generated method stub
		// System.out.println("正在获取角色，权限信息。。。。");
		// 通过当前用户的账号去数据库中查询当前用户的角色信息
		String account = (String) principals.getPrimaryPrincipal();
		System.out.println(account);

		// 假设通过账号找到了角色信息一个用户可以有多个角色
		Set<String> roles = new HashSet<>();
		// roles.add("student");
		// roles.add("teacher");

		// 通过角色查询角色对应权限
		Set<String> perms = new HashSet<>();
		User user = userService.findRolesAndPerms(account);
		//System.out.println("myRealm里面user的角色和权限"+user);
		//将user中的角色信息放到roles集合中
		System.out.println("myRealm里面user的角色和权限" + user);
		// 将user中的角色信息放到roles集合中
		for (Roles role : user.getRoles()) {
			// 角色
			roles.add(role.getType());// type是角色的名字
			for (Perms p : role.getPerms()) {
				// 权限，得到权限名字
				perms.add(p.getType());// 权限的名字
			}

		}

		System.out.println("myRealm里面user的角色和权限"+user);

		Subject currentUser = SecurityUtils.getSubject();
		Session session = currentUser.getSession();
		session.setAttribute("user",user);
		
		

		//perms.add("student:del");
		//perms.add("student:find");
		//perms.add("student:add");
		

		// perms.add("student:del");
		// perms.add("student:find");
		// perms.add("student:add");

		// 授权info
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		info.setRoles(roles);
		info.setStringPermissions(perms);
		System.out.println("=================================================================");
		//info里面从数据库查到的角色和权限信息，和shiro里面的角色和权限笔记，如果相同，对请求进行放行

		// info里面从数据库查到的角色和权限信息，和shiro里面的角色和权限笔记，如果相同，对请求进行放行
		return info;

	}
	
	
	

	// 获取认证（判断账号密码）的信息（账号密码）
	// 如果这个方法返回null,表示没找到对应的账号，shiro就会报账号不存在的异常
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("正在进行认证。。。。。");
		//获取到账号，根据账号去数据库，查询账号信息（账号，密码等）
		String account = (String)token.getPrincipal();//获取账号
		String pwd = new String((char[])token.getCredentials());//char[]  获取密码，返回的是char数组，需要强转为字符数组，再转为字符串
		//System.err.println(">>>>>"+pwd);
	
		// 调用service 方法查询数据库
		// 通过账号找到了以下信息
		// User user = new User().setAccount("zhangsan").setPwd("123");
		User user = userService.findByAccount(account);
		
		//获得当前用户操作
		Subject currentUser = SecurityUtils.getSubject();
		Session session = currentUser.getSession();
		session.setAttribute("user", user);
		
		if (user == null) {
			return null;
		}
		System.out.println("myRealm从数据查到的密码" + user.getPassword());

		// 创建认证info的对象
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getAccount(), user.getPassword(), getName());// getName()获取当前realm的名字
																														// 继承过来的方法
		return info;
	}

}
